from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets
from rest_framework.response import Response

from study.models import Student, Classes
from study.serializer import StudentSerializer, ClassesSerializer
# 状态码，2开头为成功,4开头为异常
from rest_framework.status import HTTP_201_CREATED, HTTP_404_NOT_FOUND, HTTP_204_NO_CONTENT
from rest_framework.decorators import action  # 从装饰器导入action行动
'''
class StudentViewSet(viewsets.ViewSet):
    # 查全部
    def list(self, request):
        # 获取查询集queryset
        queryset = Student.objects.all()
        # 序列化，实例序列化器，将查询集转为了json格式数据传到前端
        serializer = StudentSerializer(queryset, many=True)
        return Response(serializer.data)
    # 增加数据
    def create(self, request):
        """
        创建数据
        1.获取前端传入的数据，并反序列化
        2.校验
        3.保存
        4.返回响应
        :param request:
        :return:
        """
        res = request.data  # 收到的所有数据都在data里
        # python是没有json的，所以需要反序列化，将json转为模型对象
        serializer = StudentSerializer(data=res)
        serializer.is_valid(raise_exception=True)  # 序列化器自带的校验并抛出异常
        serializer.save()  # 没有异常则保存
        return Response(serializer.data, status=HTTP_201_CREATED)  # 返回响应，并显示状态码
    # 查单一，需要pk值
    def retrieve(self, request, pk):
        """
        1.依据PK查询指定对象：
            如果有，序列化转json
            如果没有，返回404，找不到学生信息
        2.返回响应
        """
        try:  # 如果有
            student = Student.objects.get(id=pk)
        except Student.DoesNotExist:  # 如果没有
            return Response(status=HTTP_404_NOT_FOUND)
        serializer = StudentSerializer(instance=student)  # instance为实例
        return Response(serializer.data)
    # 修改数据，需要pk值
    def update(self, request, pk):
        """
        先用了查单一方法后用了增加数据方法打了一套组合拳
        1.依据PK查询指定对象：
            如果有，序列化转json
            如果没有，返回404，找不到学生信息
        2.获取前端传入的数据，并反序列化
        3.校验
        4.保存
        5.返回响应
        """
        try:  # 如果有
            student = Student.objects.get(id=pk)
        except Student.DoesNotExist:  # 如果没有
            return Response(status=HTTP_404_NOT_FOUND)
        serializer = StudentSerializer(instance=student, data=request.data)
        serializer.is_valid(raise_exception=True)
        # save()方法如果对象不是空的，就修改，如果对象是空的，就保存
        serializer.save()
        return Response(serializer.data)
    # 删除数据，需要pk值
    def destroy(self, request, pk):
        """
        先用查单一方法后直接删除
        1.依据PK查询指定对象：
            如果有，序列化转json
            如果没有，返回404，找不到学生信息
        2.删除
        :param request:
        :param pk:
        :return:
        """
        try:  # 如果有
            student = Student.objects.get(id=pk)
        except Student.DoesNotExist:  # 如果没有
            return Response(status=HTTP_404_NOT_FOUND)
        student.delete()  # 数据直接被删除
        return Response(status=HTTP_204_NO_CONTENT)  # 返回响应没有内容
'''


class StudentViewSet(viewsets.ModelViewSet):
    """
    create:
    新增学生信息
    destroy:
    删除学生信息
    update:
    修改学生信息
    list:
    查看全部学生信息
    retrieve:
    查看单个学生信息
    """
    # 用过滤filter的原因是删除数据时所删除的数据不能给到前端看到还在
    queryset = Student.objects.filter(is_delete=False)
    serializer_class = StudentSerializer  # 指定序列化器类


class ClassesViewSet(viewsets.ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = ClassesSerializer  # 指定序列化器类

    @action(methods=['get'], detail=False)  # methods为方法，detail=False为不展示详情，否则要带pk值
    def last(self, request):  # 此方法是添加新接口，即查询最新的班级就是最后添加的班级
        last_class = Classes.objects.filter(is_delete=False).last()
        serializer = self.get_serializer(last_class)  # self.get_serializer序列化指定序列化器类
        return Response(serializer.data)